using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using Unity.Mathematics;

// 保存管理器类，继承自MonoBehaviour
public class SaveManager : MonoBehaviour
{
    // 单例模式，全局通过SaveManager.instance访问
    public static SaveManager instance;

    // 序列化字段，文件名
    [SerializeField] private string fileName;
    // 是否加密数据
    [SerializeField] private bool encryptData;

    // 游戏数据
    private GameData gameData;
    // 保存管理器列表
    private List<ISaveManager> saveManagers;
    // 文件数据处理器
    private FileDataHandler dataHandler;

    [ContextMenu("删除存档")]
    // 删除游戏数据方法
    public void DeleteSaveData()
    {
        dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
        dataHandler.Delete();
    }

    // Awake方法，在对象创建时调用
    private void Awake()
    {
        if (instance != null)
        {
            // 如果实例已存在，摧毁当前对象
            Destroy(instance.gameObject);
        }
        else
        {
            // 否则，将当前对象设置为实例
            instance = this;
        }
    }

    // Start方法，在对象启用时调用
    private void Start()
    {
        // 初始化数据处理器
        dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
        // 查找所有保存管理器
        saveManagers = FindAllSaveManagers();
        // 加载游戏数据
        LoadGame();
    }

    // 新游戏方法，初始化游戏数据
    public void NewGame()
    {
        gameData = new GameData();
    }

    // 加载游戏数据方法
    public void LoadGame()
    {
        // 从文件中加载数据
        gameData = dataHandler.Load();
        if (gameData == null)
        {
            Debug.Log("没有存档");
            NewGame();
        }
        // 将数据加载到所有保存管理器中
        foreach (ISaveManager saveManager in saveManagers)
        {
            saveManager.LoadData(gameData);
        }
        Debug.Log("加载存档");
    }

    // 保存游戏数据方法
    public void SaveGame()
    {
        // 将数据提取到gameData中
        foreach (ISaveManager saveManager in saveManagers)
        {
            saveManager.SaveData(ref gameData);
        }
        // 将gameData数据保存到文件中
        dataHandler.Save(gameData);
        Debug.Log("保存成功");
    }

    // 应用程序退出时调用，保存游戏数据
    private void OnApplicationQuit()
    {
        SaveGame();
    }

    // 查找所有保存管理器方法
    private List<ISaveManager> FindAllSaveManagers()
    {
        // 查找所有实现了ISaveManager接口的MonoBehaviour对象
        IEnumerable<ISaveManager> saveManagers = FindObjectsOfType<MonoBehaviour>(true).OfType<ISaveManager>();
        return new List<ISaveManager>(saveManagers);
    }

    // 判断有没有存档
    public bool HasSavedData()
    {
        if (dataHandler.Load() != null)
        {
            return true;
        }
        return false;
    }
}